home *** CD-ROM | disk | FTP | other *** search
-
- ; Listing7y3.s ZWEI VERWENDUNGEN EINES SPRITE AUF DER GLEICHEN ZEILE
-
- ; Dieses Beispiel zeigt, wie es möglich ist, einen Sprite 2 Mal
- ; auf der selben Zeile anzuzeigen, indem man direkt auf die Register
- ; zugreift.
-
-
- SECTION CipundCop,CODE
-
- Anfang:
- move.l 4.w,a6 ; Execbase
- jsr -$78(a6) ; Disable
- lea GfxName(PC),a1 ; Name lib
- jsr -$198(a6) ; OpenLibrary
- move.l d0,GfxBase
- move.l d0,a6
- move.l $26(a6),OldCop ; speichern die alte COP
-
- ; Pointen auf das "leere" PIC
-
- MOVE.L #BITPLANE,d0 ; wohin pointen
- LEA BPLPOINTERS,A1 ; COP-Pointer
- move.w d0,6(a1)
- swap d0
- move.w d0,2(a1)
-
- ; Wir pointen NICHT auf den Sprite !!!!!!!!!!!!!!!!!!!!
-
- move.l #COPPERLIST,$dff080 ; unsere COP
- move.w d0,$dff088 ; START COP
- move.w #0,$dff1fc ; NO AGA!
- move.w #$c00,$dff106 ; NO AGA!
-
- mouse:
- btst #6,$bfe001 ; Mouse gedrückt?
- bne.s mouse
-
- move.l OldCop(PC),$dff080 ; Pointen auf die SystemCOP
- move.w d0,$dff088 ; starten die alte SystemCOP
-
- move.l 4.w,a6
- jsr -$7e(a6) ; Enable
- move.l gfxbase(PC),a1
- jsr -$19e(a6) ; Closelibrary
- rts
-
- ; Daten
-
-
- GfxName:
- dc.b "graphics.library",0,0
-
- GfxBase:
- dc.l 0
-
- OldCop:
- dc.l 0
-
-
- SECTION GRAPHIC,DATA_C
-
- COPPERLIST:
- SpritePointers:
- dc.w $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
- dc.w $12a,0,$12c,0,$12e,0,$130,0,$132,0
- dc.w $134,0,$136,0,$138,0,$13a,0,$13c,0
- dc.w $13e,0
-
- dc.w $8E,$2c81 ; DiwStrt
- dc.w $90,$2cc1 ; DiwStop
- dc.w $92,$38 ; DdfStart
- dc.w $94,$d0 ; DdfStop
- dc.w $102,0 ; BplCon1
- dc.w $104,0 ; BplCon2
- dc.w $108,0 ; Bpl1Mod
- dc.w $10a,0 ; Bpl2Mod
-
- ; 5432109876543210
- dc.w $100,%0001001000000000 ; Bit 12 an: 1 Bitplane Lowres
-
- BPLPOINTERS:
- dc.w $e0,0,$e2,0 ;erstes Bitplane
-
- dc.w $180,$000 ; COLOR0 ; schwarzer Hintergrund
- dc.w $182,$123 ; COLOR1 ; COLOR1 des Bitplane, das
- ; in diesem Fall leer ist, und
- ; deswegen nicht erscheint.
-
- dc.w $1A2,$FF0 ; COLOR17, also COLOR1 des Sprite0 - GELB
- dc.w $1A4,$a00 ; COLOR18, also COLOR2 des Sprite0 - ROT
- dc.w $1A6,$F70 ; COLOR19, also COLOR3 des Sprite0 - ORANGE
-
- ; ---> fügt hier das Stück Copperlist ein, das am Ende des Kommentars steht
-
- dc.w $4007,$fffe ; Warte auf Zeile $40, horizontale Pos. 7
- dc.w $140,$0060 ; SPR0POS - horizontale Position
- dc.w $142,$0000 ; SPR0CTL
- dc.w $146,$0e70 ; SPR0DATB
- dc.w $144,$03c0 ; SPR0DATA - aktiviert den Sprite
-
- dc.w $4087,$fffe ; Warte auf Zeile $40, horizontale Pos. 87
- dc.w $140,$00a0 ; SPR0POS - horizontale Position
-
- ; Das gleiche für Zeile $41
-
- dc.w $4107,$fffe ; wait horiz. Position 07
- dc.w $140,$0060 ; spr0pos
-
- dc.w $4187,$fffe ; wait horiz. Position 87
- dc.w $140,$00a0 ; spr0pos
-
- ; Das gleiche für Zeile $42
-
- dc.w $4207,$fffe ; wait
- dc.w $140,$0060 ; spr0pos
-
- dc.w $4287,$fffe ; wait... und so weiter
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $43
-
- dc.w $4307,$fffe
- dc.w $140,$0060
-
- dc.w $4387,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $44
-
- dc.w $4407,$fffe
- dc.w $140,$0060
-
- dc.w $4487,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $45
-
- dc.w $4507,$fffe
- dc.w $140,$0060
-
- dc.w $4587,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $46
-
- dc.w $4607,$fffe
- dc.w $140,$0060
-
- dc.w $4687,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $47
-
- dc.w $4707,$fffe
- dc.w $140,$0060
-
- dc.w $4787,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $48
-
- dc.w $4807,$fffe
- dc.w $140,$0060
-
- dc.w $4887,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $49
-
- dc.w $4907,$fffe
- dc.w $140,$0060
-
- dc.w $4987,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $4a
-
- dc.w $4a07,$fffe
- dc.w $140,$0060
-
- dc.w $4a87,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $4b
-
- dc.w $4b07,$fffe
- dc.w $140,$0060
-
- dc.w $4b87,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $4c
-
- dc.w $4c07,$fffe
- dc.w $140,$0060
-
- dc.w $4c87,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $4d
-
- dc.w $4d07,$fffe
- dc.w $140,$0060
-
- dc.w $4d87,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $4e
-
- dc.w $4e07,$fffe
- dc.w $140,$0060
-
- dc.w $4e87,$fffe
- dc.w $140,$00a0
-
- ; Das gleiche für Zeile $4f
-
- dc.w $4f07,$fffe
- dc.w $140,$0060
-
- dc.w $4f87,$fffe
- dc.w $140,$00a0
-
- dc.w $5007,$fffe ; Warte auf Zeile $50
- dc.w $142,$0000 ; SPR0CTL - deaktiviert den Sprite
-
- dc.w $FFFF,$FFFE ; Ende der Copperlist
-
-
- SECTION LEERESPLANE,BSS_C ; Wir brauchen ein leeres Bitplane,
- ; denn ohne Bitplanes können wir
- ; keine Sprites anzeigen.
-
- BITPLANE:
- ds.b 40*256 ; leeres Bitplane Lowres
-
- end
-
- Direktes Manipulieren der Spriteregister macht es auch möglich, einen Sprite
- zwei Mal suf der selben Zeile zu malen, ihn also auf verschiedenen horizontalen
- Positionen zu setzen. Der Trick besteht in der Möglichkeit des Copper, eine
- bestimmte Position am Bildschirm abzuwarten. Am Anfang wartet man die erste
- Zeile des Bildschirmes ab, an der der Sprite beginnen soll. Im Beispiel nehmen
- wir Zeile $40, in der Copperlist:
-
- dc.w $4007,$fffe ; Warte auf Zeile $40, horizontale Pos. 7
-
- Dann werden die Register SPR0CTL, SPRDATB und SPRDAT geladen:
-
- dc.w $142,$0000 ; SPR0CTL
- dc.w $146,$0e70 ; SPR0DATB
- dc.w $144,$03c0 ; SPR0DATA - aktiviert den Sprite
-
- Dann gibt man den ersten Wert der horizontale Position des Sprite in SPRxPOS:
-
- dc.w $140,$0060 ; SPR0POS - horizontale Position
-
- Nun wartet man, bis der Elektronenstrahl an dieser Position vorbeigegangen ist:
-
- dc.w $4087,$fffe ; Warte auf Zeile $40, horizontale Pos. 87
-
- Im Beispiel ist die horizontale Position des Sprite $60. Wenn wir also auf
- Position $87 warten, dann sind wir sicher, daß der Sprite schon gezeichnet
- wurde. Wenn der Elektronenstrahl diese Position überflogen hat, dann wurde
- der Sprite auch gemalt.
-
- Wenn das einmal vorbei ist, schreiben wir die zweite Position in das Regiter
- SPRxPOS.
-
- dc.w $140,$00a0 ; SPR0POS - horizontale Position
-
- Somit wird der Sprite nochmal auf der gleichen Zeile gezeichnet. Um nun auch
- auf den folgenden Zeilen die Sprites zu verdoppeln, muß dieser Schritt nur
- immer wiederholt werden. Für die Zeile $41 schreiben wir z.B.:
-
- ; Das gleiche für Zeile $41
-
- dc.w $4107,$fffe
- dc.w $140,$0060
-
- dc.w $4187,$fffe
- dc.w $140,$00a0
-
- Es ist das Selbe wie bei Zeile $40, wir behalten die Register SPR0DATA,
- SPR0DATB und SPR0CTL konstant, um auch die Form des Sprite konstant zu
- halten. Wenn man möchte, kann man natürlich diese Werte verändern, und somit
- auch das Aussehen des Sprite.
-
- Um den Sprite zu deaktivieren muß einfach irgend etwas in das Register SPR0CLT
- geschrieben werden, etwa so:
-
- dc.w $5007,$fffe ; Warte auf Zeile $50
- dc.w $142,$0000 ; SPR0CTL - deaktiviert den Sprite
-
- Wenn ihr wirklich übertreiben wollt, dann könnt ihr auch noch zwischen
- einem Balken und dem anderen Palette ändern, um so auch noch eine
- Wiederverwendung der Farben zu haben.
- Versucht dieses Stück an dieser markierten Stelle einzufügen:
-
- ; ---> fügt hier das Stück Copperlist ein, das am Ende des Kommentars steht
-
- Wir ersetzen das letzte Stück, das sich mit dem Anzeigen des Sprites befasst.
- (Amiga+b+c+i, um ein Stück Text zu kopieren).
-
- dc.w $4007,$fffe ; Warte auf Zeile $40, horizontale Pos. 7
- dc.w $140,$0060 ; SPR0POS - horizontale Position
- dc.w $142,$0000 ; SPR0CTL
- dc.w $146,$0e70 ; SPR0DATB
- dc.w $144,$03c0 ; SPR0DATA - aktiviert den Sprite
-
- dc.w $4087,$fffe ; Warte auf Zeile $40, horizontale Pos. 87
- dc.w $1A2,$aFa ; COLOR17 ; Grünton
- dc.w $1A4,$050 ; COLOR18
- dc.w $1A6,$0a0 ; COLOR19
- dc.w $140,$00a0 ; SPR0POS - horizontale Position
-
- ; Zeile $41
- dc.w $4107,$fffe ; wait horiz. Position 07
- dc.w $1A2,$FF0 ; COLOR17 ; Orange
- dc.w $1A4,$a00 ; COLOR18
- dc.w $1A6,$F70 ; COLOR19
- dc.w $140,$0060 ; spr0pos
- dc.w $4187,$fffe ; wait horiz. Position 87
- dc.w $1A2,$aFa ; COLOR17 ; Grünton
- dc.w $1A4,$050 ; COLOR18
- dc.w $1A6,$0a0 ; COLOR19
- dc.w $140,$00a0 ; spr0pos
- ; Zeile $42
- dc.w $4207,$fffe ; wait horiz. Position 07
- dc.w $1A2,$FF0 ; COLOR17 ; Orange
- dc.w $1A4,$a00 ; COLOR18
- dc.w $1A6,$F70 ; COLOR19
- dc.w $140,$0060 ; spr0pos
- dc.w $4287,$fffe ; wait horiz. Position 87
- dc.w $1A2,$aFa ; COLOR17 ; Grünton
- dc.w $1A4,$050 ; COLOR18
- dc.w $1A6,$0a0 ; COLOR19
- dc.w $140,$00a0 ; spr0pos
- ; Zeile $43
- dc.w $4307,$fffe ; wait horiz. Position 07
- dc.w $1A2,$FF0 ; COLOR17 ; Orange
- dc.w $1A4,$a00 ; COLOR18
- dc.w $1A6,$F70 ; COLOR19
- dc.w $140,$0060 ; spr0pos
- dc.w $4387,$fffe ; wait horiz. Position 87
- dc.w $1A2,$aFa ; COLOR17 ; Grünton
- dc.w $1A4,$050 ; COLOR18
- dc.w $1A6,$0a0 ; COLOR19
- dc.w $140,$00a0 ; spr0pos
- ; Zeile $44
- dc.w $4407,$fffe ; wait horiz. Position 07
- dc.w $1A2,$FF0 ; COLOR17 ; Orange
- dc.w $1A4,$a00 ; COLOR18
- dc.w $1A6,$F70 ; COLOR19
- dc.w $140,$0060 ; spr0pos
- dc.w $4487,$fffe ; wait horiz. Position 87
- dc.w $1A2,$aFa ; COLOR17 ; Grünton
- dc.w $1A4,$050 ; COLOR18
- dc.w $1A6,$0a0 ; COLOR19
- dc.w $140,$00a0 ; spr0pos
- ; Zeile $45
- dc.w $4507,$fffe ; wait horiz. Position 07
- dc.w $1A2,$FF0 ; COLOR17 ; Orange
- dc.w $1A4,$a00 ; COLOR18
- dc.w $1A6,$F70 ; COLOR19
- dc.w $140,$0060 ; spr0pos
- dc.w $4587,$fffe ; wait horiz. Position 87
- dc.w $1A2,$aFa ; COLOR17 ; Grünton
- dc.w $1A4,$050 ; COLOR18
- dc.w $1A6,$0a0 ; COLOR19
- dc.w $140,$00a0 ; spr0pos
-
- dc.w $4607,$fffe ; Warte auf Zeile $46
- dc.w $142,$0000 ; SPR0CTL - deaktiviert den Sprite
- dc.w $FFFF,$FFFE ; Ende der Copperlist
-
-